home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byt86jan.arc / CYCLFRAC.BAS < prev    next >
BASIC Source File  |  1985-12-27  |  3KB  |  42 lines

  1. 10 '**********************************************************
  2. 20 '*    REPEATING DECIMAL TO FRACTION CONVERTING ROUTINE    *
  3. 30 '*            BY ROBERT T. KUROSAKA                       *
  4. 40 '**********************************************************
  5. 50 CLS
  6. 60 PRINT "This routine can be used with the greatest common denominator"
  7. 70 PRINT "program.  Load the GCD program, then MERGE this routine into it."
  8. 80 PRINT "The MERGEd program is designed to determine the reduced fractional"
  9. 90 PRINT "representation of a repeating decimal.":PRINT
  10. 100 PRINT "To ENTER a repeating decimal:":                                          PRINT " Type the nonrepeating part, then a `_' before the cycle."
  11. 110 PRINT "For example, 1.2_345 is the proper entry for 1.2345345345..."
  12. 120 PRINT "The decimal should always precede the `_', i.e., .333... is entered":    PRINT "as `._3'.  Reversing the `.' and `_' will cause an error.":PRINT
  13. 130 INPUT "ENTER REPEATING DECIMAL";NUMBER$
  14. 140 REM NON-REPEATING PART OF NUMBER IS THAT PART UP TO "_".  VAL OPERATOR              IGNORES ALL NUMBERS AFTER A NON-NUMERICAL CHARACTER. THUS, IN 1.2_345,          VAL("1.2_345") WILL BE 1.2, ETC.
  15. 150 NONREPEATING.PART=ABS(VAL(NUMBER$))
  16. 160 REM DEFINE A MORE READABLE FUNCTION TO USE FOR THROWING THE LEFTMOST                CHARACTER OF A STRING AWAY.
  17. 170 DEF FNDROP.LEFT$(A$)=RIGHT$(A$,LEN(A$)-1)
  18. 180 REM FIND DECIMAL POINT
  19. 190 WHILE LEFT$(NUMBER$,1) <> "."
  20. 200     NUMBER$=FNDROP.LEFT$(NUMBER$)
  21. 210 WEND
  22. 220 NUMBER$=FNDROP.LEFT$(NUMBER$)
  23. 230 REM FIND OUT HOW MANY DECIMAL PLACES THE REPEATING CYCLE IS OFFSET FROM             THE DECIMAL POINT.
  24. 240 WHILE LEFT$(NUMBER$,1) <> "_"
  25. 250     OFFSET=OFFSET+1
  26. 260     NUMBER$=FNDROP.LEFT$(NUMBER$)
  27. 270 WEND
  28. 280 REM THROW AWAY REPEATING PORTION MARKER, "_"
  29. 290 NUMBER$=FNDROP.LEFT$(NUMBER$)
  30. 300 REM HOW MANY DECIMAL PLACES ARE IN THE CYCLE?  SINCE THE REPEATING CYCLE            IS EVALUATED AFTER THROWING AWAY THE DECIMAL POINT,  MULTIPLY BY                10^-(TOTAL NUMBER OF PLACES TO THE RIGHT IT SHOULD BE SHIFTED).
  31. 310 CYCLE.LENGTH=LEN(NUMBER$)
  32. 320 REPEATING.CYCLE=VAL(NUMBER$)*10^-(OFFSET+CYCLE.LENGTH)
  33. 330 REM NUMBER=NONREPEATING PART+REPEATING CYCLE.  SINCE THE FIRST ITERATION OF         THE CYCLE IS THE ONLY ONE THAT DOES NOT CANCEL ON SUBTRACTION, ONLY USE         IT.
  34. 340 NUMBER=NONREPEATING.PART+REPEATING.CYCLE
  35. 350 REM "CLEARED.NUMBER IS THE VALUE OF THE SUBTRACTION THAT DOES AWAY WITH THE          INFINITE CYCLE (STEP 3 IN THE BYTE ARTICLE ALGORITHM).
  36. 360 CLEARED.NUMBER=NUMBER*10^CYCLE.LENGTH-NONREPEATING.PART
  37. 370 REM NOW, ASSIGN THE VALUES OF THE NUMERATOR AND DENOMINATOR TO THE VARIABLE         NAMES USED IN THE GCD ROUTINE.
  38. 380 NUM=CLEARED.NUMBER:DEN=10^CYCLE.LENGTH-1
  39. 390 REM I CONVERT NUM AND DEN TO STRINGS AND THEN BACK TO CLEAR THE GUARD               DIGITS IN THE NUM AND DEN VARIABLES. SEE BYTE ARTICLE FOR DETAILS.
  40. 400 NUM$=STR$(NUM):DEN$=STR$(DEN):NUM=VAL(NUM$):DEN=VAL(DEN$)
  41. 410 PRINT "THE EQUIVALENT UNREDUCED FRACTION IS:";NUM;"/";DEN
  42.